/**
 * C++ 代码文件（扩展名为 .cpp）并不是 C++ 程序中唯一常见的文件。另一种类型的文件称为头文件。
 * 头文件通常具有 .h 扩展名，但您偶尔会看到它们具有 .hpp 扩展名或根本没有扩展名。头文件的主要用途是将声明传播到代码 (.cpp) 文件。
 * 
 * 头文件允许我们将声明放在一个位置，然后在需要的地方导入它们。这可以节省多文件程序中的大量输入。
 * 
 * 当您#include创建文件时，所包含文件的内容将插入到包含点。这提供了一种从另一个文件中提取声明的有用方法。
 * 
 * 最佳实践
 * 命名头文件时最好使用 .h 后缀（除非您的项目已经遵循某些其他约定）。
 * 这是 C++ 头文件的长期约定，大多数 IDE 仍然默认使用 .h 而不是其他选项。
 * 
 * 不要将函数和变量定义放入头文件中（暂时）。
 * 如果该头文件随后 #included 到多个源 (.cpp) 文件中，则在头文件中定义其中任何一个都可能会导致违反 单一定义规则 (ODR)。
 * 
 * 源文件应 #include 其配对的头文件（如果存在）。
 * 避免 #include .cpp 文件。
 * 
 * 每个文件都应显式 #include 需要编译的所有头文件。不要依赖于其他标头传递地包含的标头。不幸的是，没有简单的方法可以检测您的代码文件何时意外依赖于另一个头文件包含的头文件的内容。
 * 
 * 为了最大限度地提高编译器标记缺失包含的机会，请按如下方式订购 #include：
 *   配对的头文件
 *   您项目中的其他头文件
 *   3rd 方库头
 *   标准库头文件
 *   每个分组的标题应按字母顺序排序（除非第三方库的文档指示您这样做）。
 * 这样，如果您的用户定义标头之一缺少第 3 方库或标准库标头的 #include，则更有可能导致编译错误，因此您可以修复它。
 * 
 * 头文件最佳实践
 * 以下是有关创建和使用头文件的更多建议。
 * 始终包含头部防护装置（我们将在下一课中介绍这些内容）。
 * 不要在头文件中定义变量和函数（暂时）。
 * 为头文件指定与其关联的源文件相同的名称（例如grades.h与 配对grades.cpp）。
 * 每个头文件应该有特定的工作，并且尽可能独立。例如，您可以将所有与功能 A 相关的声明放在 Ah 中，将所有与功能 B 相关的声明放在 Bh 中。这样，如果您稍后只关心 A，则可以只包含 Ah 而不会获得任何与 B 相关的内容。
 * 请注意您需要为代码文件中使用的功能显式包含哪些标头，以避免无意的传递包含。
 * 头文件应 #include 包含其所需功能的任何其他头文件。当这样的头文件本身 #include 到 .cpp 文件中时，应该可以成功编译。
 * 仅 #include 您需要的内容（不要仅仅因为可以就包含所有内容）。
 * 不要#include .cpp 文件。
 * 更喜欢在标题中放置有关某项功能或如何使用它的文档。在那里看到的可能性更大。描述某些内容如何工作的文档应保留在源文件中。
 * 
 * 
 * 
 * 
 * 如果头文件与代码文件配对（例如add.h 和add.cpp），它们应该具有相同的基本名称（add）
 * 
 * 尖括号与双引号
 * 使用双引号包含您已编写的头文件或预期在当前目录中找到的头文件。使用尖括号包含编译器、操作系统或在系统其他位置安装的第三方库附带的标头。
 * 
 * 当我们使用尖括号时，我们告诉预处理器这是一个不是我们自己编写的头文件。预处理器将仅在 .txt 文件指定的目录中搜索标头include directories。
 * 它们include directories被配置为项目/IDE 设置/编译器设置的一部分，通常默认为包含编译器和/或操作系统附带的头文件的目录。预处理器不会在项目的源代码目录中搜索头文件。
 * 当我们使用双引号时，我们告诉预处理器这是我们编写的头文件。预处理器首先会在当前目录中查找头文件。如果在那里找不到匹配的标头，它将搜索include directories.
 * 
 * 
 * 为什么 iostream 没有 .h 扩展名？
 * 另一个常见问题是“为什么 iostream（或任何其他标准库头文件）没有 .h 扩展名？”。答案是iostream.h是与iostream不同的头文件！要进行解释，需要简短的历史课。
 * 
 * 
 * 包含其他目录中的头文件
 * 另一个常见问题涉及如何包含其他目录中的头文件。
 * 一种（不好的）方法是在 #include 行中包含要包含的头文件的相对路径。例如：
 *   #include "headers/myHeader.h"
 *   #include "../moreHeaders/myOtherHeader.h"
 * 虽然这可以编译（假设文件存在于这些相对目录中），但这种方法的缺点是它要求您在代码中反映目录结构。如果您更新了目录结构，您的代码将不再有效。
 * 最好的办法是 修改IDE设置
 * 在你的tasks.json配置文件中，在“Args”部分添加一个新行：
 * "-I/source/includes"
 * 
 */

// 为了在 main.cpp 中使用这个头文件，我们必须 #include 它（使用引号，而不是尖括号）。
#include "add.h"
#include <iostream>

int main() {
    std::cout << "The sum of 3 and 4 is " << add(3, 4) << "\n";
}